package week5;

/**
 * Searching demonstrates various search algorithms on an array 
 * of objects.
 *
 * @author Lewis and Chase
 * @version 4.0 
 */
public class Searching 
{
    /**
     * 使用线性搜索搜索指定的对象数组
     * algorithm.
     *
     * @param data   被搜索的数组
     * @param min    最小值的整数型表示
     * @param max    最大值的整数型表示
     * @param target 正在搜索的元素
     * @return       需要的元素被找到时返回true
     */
    public static <T>   
		boolean linearSearch(T[] data, int min, int max, T target)
    {
        int index = min;
        boolean found = false;

        while (!found && index <= max) 
        {
            found = data[index].equals(target);
            index++;
        }

        return found;
    }

    /**
     * 使用二分查找搜索指定的对象数组
     *
     *
     * @param data   被搜索的数组
     * @param min    最小值的整数型表示
     * @param max    最大值的整数型表示
     * @param target 正在搜索的元素
     * @return       需要的元素被找到时返回true
     */
    public static <T extends Comparable<T>>  
		boolean binarySearch(T[] data, int min, int max, T target)
    {  
        boolean found = false;
        int midpoint = (min + max) / 2;  // 确定中点值

        if (data[midpoint].compareTo(target) == 0)
            found = true;

        else if (data[midpoint].compareTo(target) > 0)
        {
            if (min <= midpoint - 1)
                found = binarySearch(data, min, midpoint - 1, target);
        }
        
        else if (midpoint + 1 <= max)
            found = binarySearch(data, midpoint + 1, max, target);

        return found;
    }
}

